package controlador;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;

import javax.imageio.ImageIO;

import modelo.Barco;
import modelo.Buque;
import modelo.Destructor;
import modelo.Lancha;
import modelo.Parte;
import modelo.Portaaviones;
import modelo.RompeHielos;

import vista.BarcoPosicionable;
import vista.VistaBarco;
import vista.VistaParteRota;

import fiuba.algo3.titiritero.dibujables.SuperficiePanel;
import fiuba.algo3.titiritero.modelo.GameLoop;
import fiuba.algo3.titiritero.modelo.ObservadorDeGameLoop;

public class ObservadorDeBarcos implements ObservadorDeGameLoop{
	GameLoop gameLoop;
	protected List<VistaBarco> vistasDeLosBarcos;
	
	public ObservadorDeBarcos (GameLoop unGameLoop, List<VistaBarco> listaDeVistasDeLosBarcos) {
		gameLoop = unGameLoop;
		vistasDeLosBarcos = listaDeVistasDeLosBarcos;
	}

	@Override
	public void notificarCicloFinalizado() {
		Iterator<VistaBarco> iteradorDeVistasDeLosBarcos = vistasDeLosBarcos.iterator();
      	while (iteradorDeVistasDeLosBarcos.hasNext()) {
      		VistaBarco vistaDelBarco = iteradorDeVistasDeLosBarcos.next();
      		// Si el barco esta destruido lo saca de la vista junto con sus partes.
      		if ((vistaDelBarco.getBarco()).estaDestruido()) {
      			vistaDelBarco.removerPartesRotas(gameLoop);
	    		gameLoop.remover(vistaDelBarco);
	    		gameLoop.remover(vistaDelBarco.getPosicionable());
	    		iteradorDeVistasDeLosBarcos.remove();
	    		dibujarBarcoMuerto(vistaDelBarco);
	      	// Si el barco tiene partes rotas nuevas se las agrega.
			}
      		else {
				List<Parte> partesRotas = (vistaDelBarco.getBarco()).getPartesRotas();
				for (Parte parteRota : partesRotas) {
					if (!vistaDelBarco.parteRotaEsta(parteRota)) {
						vistaDelBarco.agregarParteRota(new VistaParteRota((BarcoPosicionable) vistaDelBarco.getPosicionable(), parteRota), gameLoop, parteRota);
					}
				}
			}
      	}
	}

	private void dibujarBarcoMuerto(VistaBarco vistaDelBarco) {
	    BufferedImage imagen = null;
	    
		Graphics grafico = ((SuperficiePanel)gameLoop.getSuperficieDeDibujo()).getBuffer();

		// En funcion del tipo de barco, se dibuja la explosion.
		Class<? extends Barco> claseBarco = vistaDelBarco.getBarco().getClass();
		BarcoPosicionable barcoPosicionable = (BarcoPosicionable) vistaDelBarco.getPosicionable();
		String direccion = null;
		
		// Se dibujan la explosion.
		if (barcoPosicionable.estaVertical()) {
			if (claseBarco == Lancha.class || claseBarco == Buque.class) {
				direccion = "/imagenes/BarcoMuertoTam2Vertical.png";
			}
			else if (claseBarco == Destructor.class || claseBarco == RompeHielos.class) {
				direccion = "/imagenes/BarcoMuertoTam3Vertical.png";
			}
			else if (claseBarco == Buque.class) {
				direccion = "/imagenes/BarcoMuertoTam4Vertical.png";
			}
			else if (claseBarco == Portaaviones.class) {
				direccion = "/imagenes/BarcoMuertoTam5Vertical.png";
			}			
		}
		else {
			if (claseBarco == Lancha.class || claseBarco == Buque.class) {
				direccion = "/imagenes/BarcoMuertoTam2Horizontal.png";
			}
			else if (claseBarco == Destructor.class || claseBarco == RompeHielos.class) {
				direccion = "/imagenes/BarcoMuertoTam3Horizontal.png";
			}
			else if (claseBarco == Buque.class) {
				direccion = "/imagenes/BarcoMuertoTam4Horizontal.png";
			}
			else if (claseBarco == Portaaviones.class) {
				direccion = "/imagenes/BarcoMuertoTam5Horizontal.png";
			}			
		}
		
		try {
			imagen = ImageIO.read(new URL("file:///" + System.getProperty("user.dir") + direccion));
		} catch (IOException e) {
			e.printStackTrace();
		}
		grafico.drawImage(imagen, barcoPosicionable.getX(), barcoPosicionable.getY(), null);
	}

}
